package com.example.express.service.impl;

import com.example.express.bean.Express;
import com.example.express.dao.BaseExpressDao;
import com.example.express.dao.impl.ExpressDaoImpl;
import com.example.express.exception.DuplicateCodeException;
import com.example.express.service.BaseExpressService;
import com.example.express.util.RandomUtil;
import com.example.express.util.SMSUtil;

import java.util.List;
import java.util.Map;

public class ExpressServiceImpl implements BaseExpressService {
    private BaseExpressDao dao = new ExpressDaoImpl();
    /**
     * 用于查询全部快递（总数+新增），代取件（总数+新增）
     *
     * @return[{size:总数,day:新增},{size:总数,day:新增}]
     */
    @Override
    public List<Map<String, Integer>> console() {
        return dao.console();
    }

    /**
     * 分页查询全部快递信息
     *
     * @param limit
     * @param offset
     * @param pageNum
     * @return[Express{快递信息}]
     */
    @Override
    public List<Express> findAll(boolean limit, int offset, int pageNum) {
        return dao.findAll(limit,offset,pageNum);
    }

    /**
     * 根据单号查询快递信息
     *
     * @param number
     * @return {快递信息}
     */
    @Override
    public Express findByNumber(String number) {
        return dao.findByNumber(number);
    }

    /**
     * 根据取件码查询快递信息
     *
     * @param code
     * @return {快递信息}
     */
    @Override
    public Express findByCode(String code) {
        return dao.findByCode(code);
    }

    /**
     * 根据用户手机号查询快递信息
     *
     * @param userPhone
     * @return [Express{快递信息}]
     */
    @Override
    public List<Express> findByUserPhone(String userPhone) {
        return dao.findByUserPhone(userPhone);
    }

    @Override
    public List<Express> findByUserPhoneAndStatus(String userPhone, int status) {
        return dao.findByUserPhoneAndStatus(userPhone,status);
    }

    /**
     * 根据录入人手机号查询快递信息
     *
     * @param sysPhone
     * @return [Express{快递信息}]
     */
    @Override
    public List<Express> findBySysPhone(String sysPhone) {
        return dao.findBySysPhone(sysPhone);
    }

    /**
     * 录入快递信息
     *
     * @param e
     * @return 返回true则表示录入成功，false录入失败
     * @throws DuplicateCodeException
     */
    @Override
    public boolean insert(Express e) {
        e.setCode(String.valueOf(RandomUtil.getRandom()));
        try {
            boolean flag = dao.insert(e);
            if (flag){
                System.out.println("手机号"+e.getUserPhone()+"取件码"+e.getCode());
//                SMSUtil.send(e.getUserPhone(),e.getCode());
            }
            return flag;
        }catch (DuplicateCodeException duplicateCodeException){
            return insert(e);
        }
    }

    /**
     * 根据id更新快递信息
     *
     * @param id
     * @param newExpress
     * @return
     */
    @Override
    public boolean update(int id, Express newExpress) {
        if (newExpress.getUserPhone()!=null){
            dao.delete(id);
            return insert(newExpress);
        }else {
            boolean update =  dao.update(id,newExpress);
            Express e = dao.findByNumber(newExpress.getNumber());
            if (newExpress.getStatus()==1){
                updateStatus(e.getCode());
            }
            return update;
        }
    }

    /**
     * 更新快递状态为1表示取件完成
     *
     * @param code
     * @return 返回true表示更新成功，false则表示更新失败
     */
    @Override
    public boolean updateStatus(String code) {
        return dao.updateStatus(code);
    }

    /**
     * 根据id删除快递信息
     *
     * @param id
     * @return 返回true表示删除成功，false表示失败
     */
    @Override
    public boolean delete(int id) {
        return dao.delete(id);
    }
}
